package org.jsola.contract.service;

import org.jsola.contract.dao.IContractDAO;
import org.jsola.contract.dto.ContractAddDTO;
import org.jsola.contract.dto.ContractUpdateDTO;
import org.jsola.contract.dto.PdfToContractAddDTO;
import org.jsola.contract.entity.ContractDO;
import org.jsola.contract.query.ContractExportQuery;
import org.jsola.contract.query.ContractQuery;
import org.jsola.contract.vo.ContractCountVO;
import org.jsola.contract.vo.ContractListVO;
import org.jsola.contract.vo.ContractVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.Date;
import java.util.List;


/**
 * 合同
 *
 * @author JanusMix
 */
public interface IContractService extends IService<IContractDAO, ContractDO> {

    /**
     * 新增合同
     *
     * @param contractAddDTO 新增合同DTO
     * @param tokenUser      当前用户
     * @return 合同详情信息
     */
    ContractVO save(ContractAddDTO contractAddDTO, TokenUser tokenUser);

    /**
     * 批量新增合同
     *
     * @param contractAddDTOList 新增合同DTO
     * @param tokenUser          当前用户
     * @return 合同详情信息
     */
    List<ContractVO> batchSave(List<ContractAddDTO> contractAddDTOList, TokenUser tokenUser);

    /**
     * 修改合同
     *
     * @param contractUpdateDTO 修改合同DTO
     * @param tokenUser         当前用户
     * @return 更新数量
     */
    int update(ContractUpdateDTO contractUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除合同，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser   当前用户
     * @param contractIds 合同id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... contractIds);

    /**
     * 根据合同id查找
     *
     * @param contractId 合同id
     * @param siteId     所属站点id
     * @return 合同详情信息
     */
    ContractVO selectById(Long contractId, String siteId);

    /**
     * 查询合同
     *
     * @param contractQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同列表信息
     */
    List<ContractListVO> select(ContractQuery contractQuery, String siteId);

    /**
     * 根据subjectId和查询合同列表(不包含content)
     *
     * @param subjectId       业务id(目前是公司id)
     * @param partyBAccountId 签署乙方账户id
     * @param siteId          所属站点id
     * @return 合同列表信息
     */
    List<ContractDO> listNoContent(String subjectId, String partyBAccountId, String siteId);

    /**
     * 查询合同记录数
     *
     * @param contractQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同记录数
     */
    int selectCount(ContractQuery contractQuery, String siteId);

    /**
     * 分页查询合同
     *
     * @param contractQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同列表信息
     */
    Page<ContractListVO> selectPage(ContractQuery contractQuery, String siteId);

    /**
     * 分页查询合同(不校验业务id)
     *
     * @param contractQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同列表信息
     */
    Page<ContractListVO> selectPageNoSubjectId(ContractQuery contractQuery, String siteId);


    /**
     * 根据合同id查找
     *
     * @param contractId 合同id
     * @param siteId     所属站点id
     * @return 合同
     */
    ContractDO selectDOById(Long contractId, String siteId);

    /**
     * 根据合同id批量查找
     *
     * @param contractIds 合同id
     * @return 合同
     */
    List<ContractDO> selectByIds(List<Long> contractIds);

    /**
     * 根据合同id批量查找(返回值不会携带content 内容)
     *
     * @param contractIds 合同id
     * @return 合同
     */
    List<ContractDO> selectNoContentByIds(List<Long> contractIds);

    /**
     * 查询合同
     *
     * @param contractQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同列表
     */
    List<ContractDO> selectDO(ContractQuery contractQuery, String siteId);

    /**
     * 查询合同(不返回content(合同富文本)列)
     *
     * @param contractQuery 查询条件
     * @param siteId        所属站点id
     * @return 合同列表
     */
    List<ContractDO> selectNoContentDO(ContractQuery contractQuery, String siteId);

    /**
     * 查询由某个分类发起的合同列表
     *
     * @param categoryId 分类id
     * @param siteId     站点id
     * @return 合同列表
     */
    List<ContractDO> selectByCategoryId(Long categoryId, String siteId);


    /**
     * 查询正在签署的合同类型
     *
     * @param subjectIds 用工单位Ids
     * @return 正在签署的合同类型
     */
    List<Long> selectCategoryIdBySubjectIds(List<String> subjectIds);

    /**
     * 获取所有待员工签署的合同(返回值不会携带content 内容)
     *
     * @return list
     */
    List<ContractDO> selectAllReadySignContract();

    /**
     * 根据合同编号查询合同
     *
     * @param contractNo 合同编号
     * @param subjectId  业务id
     * @param siteId     站点id
     * @return 合同信息
     */
    ContractVO findByContractNo(String contractNo, String subjectId, String siteId);

    /**
     * 根据合同编号查询合同
     *
     * @param contractNo 合同编号
     * @return 合同信息
     */
    ContractDO selectByContractNo(String contractNo);

    /**
     * 根据合同id修改合同编号
     *
     * @param contractId 合同id
     * @param contractNo 合同编号
     * @param tokenUser  当前用户
     * @return 修改数量
     */
    int updateContractNoById(Long contractId, String contractNo, TokenUser tokenUser);

    /**
     * 合同概况数量统计
     *
     * @param contractType 合同类型
     * @param subjectId    业务ID
     * @param tokenUser    当前用户
     */
    ContractCountVO getContractCount(Integer contractType, String subjectId, TokenUser tokenUser);

    /**
     * 合同概况数量统计(业务id可以传多个)
     *
     * @param contractType 合同类型
     * @param subjectIds   业务IDs
     * @param tokenUser    当前用户
     */
    ContractCountVO getContractCount(Integer contractType, List<String> subjectIds, TokenUser tokenUser);


    /**
     * 修改小程序合同是否展示
     *
     * @param contractId 合同id
     * @param isShow     是否展示
     * @param tokenUser  当前用户
     */
    void updateAppShowById(Long contractId, Boolean isShow, TokenUser tokenUser);

    /**
     * 根据合同id删除合同及相关信息
     *
     * @param contractId 合同id
     * @param tokenUser  当前用户
     */
    void deleteContractAndRelationById(Long contractId, TokenUser tokenUser);

    /**
     * 查询合同列表(单租户/多租户均可)
     *
     * @param contractExportQuery 查询参数
     * @param tokenUser           当前用户
     * @return 合同列表
     */
    List<ContractListVO> selectContractList(ContractExportQuery contractExportQuery, TokenUser tokenUser);

    /**
     * 根据pdf新增合同
     *
     * @param pdfToContractAddDTO 根据pdf新增合同实体
     * @param tokenUser           当前用户
     * @return 合同展示对象
     */
    Integer saveWordToContract(PdfToContractAddDTO pdfToContractAddDTO, TokenUser tokenUser);

    /**
     * 查询所有未到期的合同,不包含合同富文本内容
     *
     * @return 合同列表
     */
    List<ContractDO> listAllNoExpireContract();


    /**
     * 查询公司下的合同信息
     *
     * @param subjectId 公司Id
     * @return 公司下的合同类型分组
     */
    List<ContractDO> selectBySubjectId(String subjectId);

    /**
     * 查询指定账户的合同名以指定字段开头的数量
     *
     * @param name            名称
     * @param partyBAccountId B方Id
     * @param notContractId   排除Id 为空查所有
     * @return 数量
     */
    int selectCountByNameStart(String name, String partyBAccountId, Long notContractId);


    /**
     * 查询日期内发起签署的合同(只返回创建日期)
     *
     * @param siteId     站点Id
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @param subjectIds 业务Id(用工单位Id)
     * @return 日期内发起签署的合同(只返回创建日期)
     */
    List<ContractDO> selectBySiteIdAndDate(String siteId, Date startDate, Date endDate, List<String> subjectIds);

}


